// /*
//  * @Author: szx
//  * @Date: 2022-03-11 14:54:28
//  * @LastEditTime: 2022-03-11 15:43:40
//  * @Description:
//  * @FilePath: \MDN_JS学习\手撸JS源码\WPromise.js
//  */
// class WPromise {
//     static pending = 'pending';
//     static fulfilled = 'fulfilled';
//     static rejected = 'rejected';

//     constructor(executor) {
//         this.status = WPromise.pending; // 初始化状态为pending
//         this.value = undefined; // 存储 this._resolve 即操作成功 返回的值
//         this.reason = undefined; // 存储 this._reject 即操作失败 返回的值
//         // 存储then中传入的参数
//         // 至于为什么是数组呢？因为同一个Promise的then方法可以调用多次
//         this.callbacks = [];
//         // 创建之后，直接执行executor,
//         // 这里绑定this是为了防止执行时this的指向改变
//         executor(this._resolve.bind(this), this._reject.bind(this));
//     }

//     // onFulfilled 是成功时执行的函数
//     // onRejected 是失败时执行的函数
//     then(onFulfilled, onRejected) {
//         if (typeof onFulfilled !== 'function') {
//             onFulfilled = (value) => value;
//         }
//         if (typeof onRejected !== 'function') {
//             onRejected = (reason) => {
//                 throw Error(reason);
//             };
//         }
//         // 返回一个新的Promise
//         return new WPromise((nextResolve, nextReject) => {
//             if (this.status === WPromise.pending) {
//             } else if (this.status === WPromise.fulfilled) {
//                 nextResolve();
//             }
//             // 这里之所以把下一个Promsie的resolve函数和reject函数也存在callback中
//             // 是为了将onFulfilled的执行结果通过nextResolve传入到下一个Promise作为它的value值
//             this._handler({
//                 nextResolve,
//                 nextReject,
//                 onFulfilled,
//                 onRejected
//             });
//         });
//     }

//     // catch方法只有一个参数用于处理错误的情况
//     catch(onRejected) {
//         return this.then(null, onRejected);
//     }

//     finally(onFinally) {
//         return this.then(onFinally, onFinally);
//     }

//     _resolve(value) {
//         if (this.status !== WPromise.pending) return;

//         // 处理onFulfilled执行结果是一个Promise时的情况
//         // 这里可能理解起来有点困难
//         // 当value instanof WPromise时，说明当前Promise肯定不会是第一个Promise
//         // 而是后续then方法返回的Promise（第二个Promise）
//         // 我们要获取的是value中的value值（有点绕，value是个promise时，那么内部存有个value的变量）
//         // 怎样将value的value值获取到呢，可以将传递一个函数作为value.then的onFulfilled参数
//         // 那么在value的内部则会执行这个函数，我们只需要将当前Promise的value值赋值为value的value即可
//         // if (value instanceof WPromise) {
//         //     value.then(this._resolve.bind(this), this._reject.bind(this));
//         //     return;
//         // }

//         // 通知事件执行
//         setTimeout(() => {
//             this.value = value;
//             this.status = WPromise.fulfilled; // 将状态设置为成功
//             this.callbacks.forEach((cb) => this._handler(cb));
//         }, 0);
//     }

//     _reject(reason) {
//         if (this.status !== WPromise.pending) return;

//         // if (reason instanceof WPromise) {
//         //     reason.then(this._resolve.bind(this), this._reject.bind(this));
//         //     return;
//         // }

//         setTimeout(() => {
//             this.reason = reason;
//             this.status = WPromise.rejected; // 将状态设置为失败
//             this.callbacks.forEach((cb) => this._handler(cb));
//         }, 0);
//     }

//     _handler(callback) {
//         const { onFulfilled, onRejected, nextResolve, nextReject } = callback;

//         if (this.status === WPromise.pending) {
//             this.callbacks.push(callback);
//             return;
//         } else if (this.status === WPromise.fulfilled) {
//             // 传入存储的值
//             // 未传入onFulfilled时，将value传入
//             const nextValue = onFulfilled ? onFulfilled(this.value) : this.value;
//             nextResolve(nextValue);
//             return;
//             // Reject处理
//         } else {
//             // 传入存储的错误信息
//             const nextReason = onRejected ? onRejected(this.reason) : this.reason;
//             nextReject(nextReason);
//         }
//     }
// }

// function fetchData() {
//     return new WPromise((resolve, reject) => {
//         setTimeout(() => {
//             resolve('willem');
//         }, 1000);
//     });
// }

// // fetchData()
// //     .then(
// //         (data) => {
// //             console.log(data);
// //             return new WPromise((resolve) => {
// //                 setTimeout(() => {
// //                     resolve(data + ' wei');
// //                 }, 1000);
// //             });
// //         },
// //         (err) => {}
// //     )
// //     .then((data2) => {
// //         console.log(data2); // willem wei
// //     });
// // let f1 = new WPromise((resolve,reject)=>{
// //     resolve(3)
// //     console.log(4)
// // }).then((value)=>{
// //     console.log(value)
// // })

// var p = new WPromise(function (resolve, reject) {
//     console.log('执行');
//     resolve(3);
//     //     setTimeout(function () {
//     //         resolve(2);
//     //     }, 2000);
// });
// // console.log(p);
// p.then(
//     function (res) {
//         console.log('suc', res);
//         return 3;
//     },
//     function (err) {
//         console.log('err', err);
//     }
// );
// console.log('输出');
